import API from '@/api/common'
import storage from '@/perm/utils/storage'

const TokenKey = 'at'
const UserInfoKey = 'ui'

/**
 * 获取token字符串
 * @returns {*}
 */
function getAccessToken () {
    if (getToken()) {
        return getToken()['access_token']
    } else {
        return null
    }
}

/**
 * 获取整个token对象
 * @returns {*}
 */
function getToken () {
    return storage.get(TokenKey)
}

/**
 * 此处token为OAuth2格式的返回消息，包括超期时间
 * @param token  {object}
 * @param token.access_token {string} 实际token字符串
 * @param token.expires_in {number} 将在多少秒超期，存储时计算超期时间
 * @returns {*|void}
 */
function setToken (token) {
    const now = new Date().getTime()
    token['expires_at'] = now + token['expires_in'] * 1000
    return storage.set(TokenKey, token)
}

function removeToken () {
    return storage.remove(TokenKey)
}

export function getUserInfo () {
    return storage.get(UserInfoKey)
}

function setUserInfo (info) {
    storage.set(UserInfoKey, info)
}

function removeUserInfo () {
    return storage.remove(UserInfoKey)
}

/**
 * 检查登陆状态，登陆时同时缓存了用户信息和token，
 * 二者同时存在才表明登陆有效，
 * 并且token必须在有效期内, 如果超期就抹掉token
 * 否则要求重新登陆
 */
function checkLogin () {
    // 有token但是超期
    if (getToken() && new Date().getTime() > getToken()['expires_at']) {
        removeToken()
        removeUserInfo()
    }
    return getToken()
}

/**
 * 检查用户信息是否完整
 */
function checkUserInfo () {
    // 用户必须要有用户信息和商户信息
    const map = getUserInfo()
    return map && !map.needUpdate && map.merchant && map.user
}

/**
 * 检查是否注册完成
 */
function checkFullRegister () {
    return checkLogin() && checkUserInfo()
}

/**
 * 判断是否有权限
 * @param roles
 * @param permissionRoles
 * @returns {*}
 */
function hasPermission (roles, permissionRoles) {
    if (roles.indexOf('merchant') >= 0) return true // admin permission passed directly
    if (!permissionRoles) return true
    return roles.some(role => permissionRoles.indexOf(role) >= 0)
}

/**
 * 获取用户信息，成功后生成用户菜单和一些权限目录
 */
function requestUserInfo () {
    return new Promise((resolve, reject) => {
        // Merchants.getCurrentUserMerchant()
        //     .then(res => {
        //         // 发送载入完成事件
        //         setUserInfo(res)
        //         EventBus.$emit('loadedUserInfo')
        //         // let checkResult = checkUserInfo();
        //         // // 检查信息是否完整，不完整登出刷新
        //         // if (!checkResult) {
        //         //     this.logout();
        //         // }
        //         resolve(res)
        //     })
        //     .catch(reject)
    })
}

/**
 * 用户登陆
 * 成功后获取用户信息
 */
function login ({ username, password, client, params }) {
    return new Promise((resolve, reject) => {
        API.login({ username, password, client: client || 'xb', params })
            .then(data => {
                setToken(data)
                resolve(data)
            })
            .catch(reject)
    })
}

/**
 * 登出
 * 清除本地缓存，并向后台发送登出操作
 */
function logout () {
    removeToken()
    removeUserInfo()
}

/**
 * 快速获取id
 */
function getUserId () {
    return getUserInfo().user.id || ''
}

function getUserName () {
    return getUserInfo().user.username || ''
}

export default {
    getAccessToken,
    getToken,
    setToken,
    removeToken,
    getUserInfo,
    setUserInfo,
    removeUserInfo,
    checkLogin,
    hasPermission,
    login,
    logout,
    getUserId,
    getUserName,
    requestUserInfo,
    checkUserInfo,
    checkFullRegister
}
